package org.example.util;

import org.example.gui.panel.WorkingPanel;

import javax.swing.*;
import java.awt.*;

/**
 * 工具类 CenterPanel 居中面板，实现了一个 可以有一个子面板 并且该子面板 居中 的面板
 * （所有的工作面板，都要用这个居中工具，例如SpendPanel，RecordPanel...）
 */
public class CenterPanel extends JPanel {
    private final double rate;          // Panel 缩放比例
    private final boolean stretch;      // 是否缩放 Panel
    private JComponent c;


    /**
     * @param rate    缩放比列
     * @param stretch 是否缩放
     */
    public CenterPanel(double rate, boolean stretch) {
        this.setLayout(null);
        this.rate = rate;
        this.stretch = stretch;
    }


    /**
     * @param rate 缩放比列
     */
    public CenterPanel(double rate) {
        this(rate, true);
    }


    /**
     * 居中设置
     */
    @Override
    public void repaint() {
        //只对本类的swing组件进行操作，其他不管
        if (null != c) {
            Dimension containerSize = this.getSize();
            Dimension componentSize = c.getPreferredSize();
            //如果是缩放
            if (stretch)
                c.setSize((int) (containerSize.width * rate),
                        (int) (containerSize.height * rate));
            else
                c.setSize(componentSize);
            //重置位置使其居中
            c.setLocation(containerSize.width / 2 - c.getSize().width / 2,
                    containerSize.height / 2 - c.getSize().height / 2);
        }
        //调用父方法更新
        super.repaint();
    }


    /**
     * 用于显示（切换）面板
     * 点击 ToolBar 按钮时，切换面板
     *
     * @param p 待居中的子面板
     */
    public void show(JComponent p) {
        this.c = p;
        //获取当前面板的所有子面板
        Component[] cs = getComponents();
        //全部清除（点击切换Button时，清除之前的组件）
        for (Component c : cs) {
            remove(c);
        }
        //加进来一个子面板
        add(p);
        //如果是一个实现了 WorkingPanel 的子类，会执行它的 updateData() 方法
        if ((p instanceof WorkingPanel)) {
            ((WorkingPanel) p).updateData();
        }
        //居中处理
        this.updateUI();
    }
}
